home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / a_average.asm next >
Encoding:
Assembly Source File  |  2001-03-20  |  4.9 KB  |  335 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     .586
  19.     .mmx
  20.     .model    flat
  21.     .code
  22.  
  23.     extern _MMX_enabled : byte
  24.  
  25.     public    _asm_average_run
  26.  
  27. ;asm_average_run(
  28. ;    [esp+ 4] void *dst,
  29. ;    [esp+ 8] void *src,
  30. ;    [esp+12] ulong width,
  31. ;    [esp+16] ulong height,
  32. ;    [esp+20] ulong srcstride,
  33. ;    [esp+24] ulong dststride);
  34.  
  35. _asm_average_run:
  36.     test    _MMX_enabled, 1
  37.     jnz    _asm_average_run_MMX
  38.  
  39.     push    ebp
  40.     push    edi
  41.     push    esi
  42.     push    edx
  43.     push    ecx
  44.     push    ebx
  45.     push    eax
  46.  
  47.     mov    esi,[esp+ 8+28]
  48.     mov    edi,[esp+20+28]
  49.     mov    edx,[esp+ 4+28]
  50.  
  51.     mov    ebp,[esp+16+28]
  52.  
  53. rowloop:
  54.     push    ebp
  55.     mov    ebp,[esp+12+32]
  56.     mov    eax,ebp
  57.     shl    eax,2
  58.     add    esi,eax
  59. colloop:
  60.     push    edx
  61.  
  62.     mov    eax,[esi-4]
  63.     mov    ebx,[esi+4-4]
  64.     mov    ecx,eax
  65.     mov    edx,ebx
  66.  
  67.     and    eax,00ff00ffh
  68.     and    ebx,00ff00ffh
  69.     and    ecx,0000ff00h
  70.     and    edx,0000ff00h
  71.     add    eax,ebx
  72.     add    ecx,edx
  73.  
  74.     mov    ebx,[esi+edi+4-4]
  75.     mov    edx,0000ff00h
  76.     and    edx,ebx
  77.     and    ebx,00ff00ffh
  78.     add    eax,ebx
  79.     add    ecx,edx
  80.  
  81.     mov    ebx,[esi+edi*2-4]
  82.     mov    edx,0000ff00h
  83.     and    edx,ebx
  84.     and    ebx,00ff00ffh
  85.     add    eax,ebx
  86.     add    ecx,edx
  87.  
  88.     mov    ebx,[esi+edi*2+4-4]
  89.     mov    edx,0000ff00h
  90.     and    edx,ebx
  91.     and    ebx,00ff00ffh
  92.     add    eax,ebx
  93.     add    ecx,edx
  94.  
  95.     mov    ebx,[esi-4-4]
  96.     mov    edx,0000ff00h
  97.     and    edx,ebx
  98.     and    ebx,00ff00ffh
  99.     add    eax,ebx
  100.     add    ecx,edx
  101.  
  102.     mov    ebx,[esi+edi-4-4]
  103.     mov    edx,0000ff00h
  104.     and    edx,ebx
  105.     and    ebx,00ff00ffh
  106.     add    eax,ebx
  107.     add    ecx,edx
  108.  
  109.     mov    ebx,[esi+edi*2-4-4]
  110.     mov    edx,0000ff00h
  111.     and    edx,ebx
  112.     and    ebx,00ff00ffh
  113.     add    eax,ebx
  114.     add    ecx,edx
  115.  
  116.     mov    ebx,eax
  117.     mov    edx,ecx
  118.     shl    eax,3
  119.     sub    esi,4
  120.     shl    ecx,3
  121.     sub    eax,ebx
  122.     sub    ecx,edx
  123.  
  124.     IF 1
  125.     mov    ebx,[esi+edi]
  126.  
  127.     shl    ebx,5
  128.     mov    edx,001fe000h
  129.  
  130.     shl    eax,2
  131.     and    edx,ebx
  132.  
  133.     shl    ecx,2
  134.     and    ebx,1fe01fe0h
  135.  
  136.     add    eax,ebx
  137.     add    ecx,edx
  138.     ELSE
  139.     mov    ebx,[esi+edi]
  140.     mov    edx,0000ff00h
  141.     and    edx,ebx
  142.     and    ebx,00ff00ffh
  143.     shl    ebx,5
  144.     lea    eax,[eax*4]
  145.     shl    edx,5
  146.     lea    ecx,[ecx*4]
  147.     add    eax,ebx
  148.     add    ecx,edx
  149.     ENDIF
  150.  
  151.     shr    eax,8
  152.     and    ecx,00ff0000h
  153.     shr    ecx,8
  154.     and    eax,00ff00ffh
  155.     pop    edx
  156.     or    eax,ecx
  157.  
  158.     mov    [edx+ebp*4-4],eax
  159.     dec    ebp
  160.     jne    colloop
  161.  
  162.     pop    ebp
  163.  
  164.     add    esi,edi
  165.     add    edx,[esp+24+28]
  166.  
  167.     dec    ebp
  168.     jne    rowloop
  169.  
  170.     pop    eax
  171.     pop    ebx
  172.     pop    ecx
  173.     pop    edx
  174.     pop    esi
  175.     pop    edi
  176.     pop    ebp
  177.     ret
  178.  
  179.     align    8
  180.  
  181. MMX_multiplier28    dq    001c001c001c001ch
  182.  
  183. _asm_average_run_MMX:
  184.     push    ebp
  185.     push    edi
  186.     push    esi
  187.     push    edx
  188.     push    ecx
  189.     push    ebx
  190.     push    eax
  191.  
  192.     mov    esi,[esp+ 8+28]
  193.     mov    edi,[esp+20+28]
  194.     mov    edx,[esp+ 4+28]
  195.  
  196.     mov    ebp,[esp+16+28]
  197.  
  198.     ;mm6: neighbor multiplier (28)
  199.     ;mm7: zero
  200.  
  201.     movq    mm6,MMX_multiplier28
  202.     pxor    mm7,mm7
  203.  
  204. rowloop_MMX:
  205.     push    ebp
  206.     push    edx
  207.     push    esi
  208.     mov    ebp,[esp+12+40]
  209.  
  210.     movd    mm0,[esi-4]
  211.     punpcklbw mm0,mm7
  212.  
  213.     movq    mm1,[esi]
  214.     movq    mm2,mm1
  215.     punpcklbw mm1,mm7
  216.     punpckhbw mm2,mm7
  217.     paddw    mm0,mm1
  218.     paddw    mm0,mm2
  219.  
  220.     movd    mm1,[esi+edi*2-4]
  221.     punpcklbw mm1,mm7
  222.     paddw    mm0,mm1
  223.  
  224.     movq    mm1,[esi+edi*2]
  225.     movq    mm2,mm1
  226.     punpcklbw mm1,mm7
  227.     punpckhbw mm2,mm7
  228.     paddw    mm0,mm1
  229.     paddw    mm0,mm2
  230.  
  231.     movd    mm1,[esi+edi-4]
  232.     punpcklbw mm1,mm7
  233.     movd    mm2,[esi+edi+4]
  234.     punpcklbw mm2,mm7
  235.     paddw    mm1,mm2
  236.     paddw    mm1,mm0
  237.     pmullw    mm1,mm6
  238.  
  239.     movd    mm2,[esi+edi]
  240.     punpcklbw mm2,mm7
  241.     psllw    mm2,5
  242.     paddw    mm2,mm1
  243.     psrlw    mm2,8
  244.     packuswb mm2,mm2
  245.     movd    [edx],mm2
  246.  
  247.     add    esi,4
  248.     dec    ebp
  249.  
  250.     movd    mm1,[esi+4]
  251.     add    edx,4
  252.     movd    mm4,[esi+edi*2+4]
  253.     punpcklbw mm1,mm7
  254.     punpcklbw mm4,mm7
  255.     paddw    mm0,mm1
  256.     movd    mm1,[esi-8]
  257.     paddw    mm0,mm4
  258.  
  259.     jmp    colloop_MMX_entry
  260.  
  261. colloop_MMX:
  262.     movd    mm1,[esi+4]
  263.     add    edx,4
  264.  
  265.     movd    mm4,[esi+edi*2+4]
  266.     punpcklbw mm1,mm7
  267.  
  268.     paddw    mm3,mm2
  269.     punpcklbw mm4,mm7
  270.  
  271.     psrlw    mm3,8
  272.     paddw    mm0,mm1
  273.  
  274.     movd    mm1,[esi-8]
  275.     packuswb mm3,mm3
  276.  
  277.     movd    [edx-4],mm3
  278.     paddw    mm0,mm4
  279.  
  280. colloop_MMX_entry:
  281.  
  282.     movd    mm2,[esi+edi*2-8]
  283.     punpcklbw mm1,mm7
  284.  
  285.     punpcklbw mm2,mm7
  286.     psubw    mm0,mm1
  287.  
  288.     movd    mm1,[esi+edi-4]
  289.     psubw    mm0,mm2
  290.  
  291.     movd    mm2,[esi+edi+4]
  292.     punpcklbw mm1,mm7
  293.  
  294.     movd    mm3,[esi+edi]
  295.     punpcklbw mm2,mm7
  296.  
  297.     punpcklbw mm3,mm7
  298.     paddw    mm1,mm0
  299.  
  300.     psllw    mm3,5
  301.     paddw    mm2,mm1
  302.  
  303.     pmullw    mm2,mm6
  304.     add    esi,4
  305.  
  306.     dec    ebp
  307.     jne    colloop_MMX
  308.  
  309.     paddw    mm3,mm2
  310.     psrlw    mm3,8
  311.     packuswb mm3,mm3
  312.     movd    [edx],mm3
  313.  
  314.     pop    esi
  315.     pop    edx
  316.     pop    ebp
  317.  
  318.     add    esi,edi
  319.     add    edx,[esp+24+28]
  320.  
  321.     dec    ebp
  322.     jne    rowloop_MMX
  323.  
  324.     pop    eax
  325.     pop    ebx
  326.     pop    ecx
  327.     pop    edx
  328.     pop    esi
  329.     pop    edi
  330.     pop    ebp
  331.     emms
  332.     ret
  333.  
  334.     end
  335.